package com.william.jdbcplus.core.crud;

import com.william.jdbcplus.common.entity.Entity;
import com.william.jdbcplus.common.page.IPage;
import com.william.jdbcplus.core.query.EntityWrap;

import java.util.List;
import java.util.Map;

/**
 * 基类增删改查接口
 *
 * @author william
 */
public interface IBaseCrud {

    /**
     * 插入一条记录
     *
     * @param entity 实体
     * @param config 配置
     */
    <M extends Entity> String insert(M entity, CrudConfig config);

    /**
     * 复制一条记录
     *
     * @param entity 实体
     * @param config 配置
     */
    <M extends Entity> String copy(M entity, CrudConfig config);

    /**
     * 插入多条记录, 用jdbc connection实现， 在事务处理中会卡死，不建议使用
     *
     * @param entityList 实体
     * @param config     配置
     */
    <M extends Entity> int insertBatch(List<M> entityList, CrudConfig config);

    /**
     * 插入多条记录
     *
     * @param entityList 实体
     * @param config     配置
     */
    <M extends Entity> int insertList(List<M> entityList, CrudConfig config);

    /**
     * 复制数据
     *
     * @param entityList 实体
     * @param config     配置
     */
    <M extends Entity> int copyList(List<M> entityList, CrudConfig config);

    /**
     * 逻辑删除
     *
     * @param wrap   查询条件
     * @param config 配置
     */
    <M extends Entity> int deleteLogic(EntityWrap<M> wrap, CrudConfig config);

    /**
     * 物理删除
     *
     * @param wrap   查询条件
     * @param config 配置
     */
    <M extends Entity> int deleteReal(EntityWrap<M> wrap, CrudConfig config);

    /**
     * 根据条件，更新字段
     *
     * @param updateMap 需要根据的字段和对应的值
     * @param wrap      查询条件
     * @param config    配置
     */
    <M extends Entity> int update(Map<String, Object> updateMap, EntityWrap<M> wrap, CrudConfig config);

    /**
     * 根据 Wrapper 条件，查询总记录数
     *
     * @param wrap   查询条件
     * @param config 配置
     */
    <M extends Entity> int selectCount(EntityWrap<M> wrap, CrudConfig config);

    /**
     * 根据 entity 条件，查询全部记录
     *
     * @param wrap   查询条件
     * @param config 配置
     */
    <M extends Entity> List<M> selectList(EntityWrap<M> wrap, CrudConfig config);

    /**
     * 根据 wrapper 条件，查询分页
     *
     * @param page   分页条件
     * @param wrap   查询条件
     * @param config 配置
     */
    <M extends Entity> IPage<M> selectPage(IPage<?> page, EntityWrap<M> wrap, CrudConfig config);

}
